//函數
fun init(ctx: &mut TxContext) {
transfer::share_object(
Grocery{id:object::new(ctx),
profits:balance::zero<SUI>()});
transfer::transfer(
GroceryOwnerCapability {id:object::new(ctx)},tx_context::sender(ctx));
}
了解開頭後,先來講講這個函數的用意,這個init的初始設定,是要將我們這個部署合約者,在之後擁有權限來賣材料以及,有權限把錢從雜貨店裡領走,如果沒有設定,那就完蛋了,因為合約指認你的地址,所以我們必許告訴系統我們的錢包是現在這個,只有現在這個錢包擁有權限。
接著講代碼
transfer::share_object - 這裡是調用了transfer,sui的預設模組,然後我們使用他的share_object的函數功能。
transfer 在sui中主要是傳遞相關的模組,主要傳遞object。
share_object 用於當我們要讓任何人都有權限可以使用某個結構時,所要使用的。
這邊會使用share_object的原因是,雜貨店是公開上大家都可以來購買的,所以當後續要買火腿跟麵包時,是透過跟這間雜貨店購買,這時會需要輸入這間雜貨店的ID,讓系統知道我們是跟哪間雜貨店買,所以需要分享他的關係。當然可能會有疑問,這樣放在裡面的錢,不就大家都可以拿? 這部分我們會在後續編寫函數時,寫一個提領雜貨店款項的函數,而其中會有一個部分是,只有老闆才能執行這個動作的限制。
接著share_object(Grocery{id:object::new(ctx),profits:balance::zero()});
括號中,為share_object所需要給的參數,我們來看一下,原本sui預設的share_object他的樣子
public native fun share_object<T: key>(obj: T);
///有需要可去官網看,連結在第一章的最後。找到transfer點進去找找。
我們可以看到,系統預設 share_object 的()中,只需要填入一個參數,也就是一個object。
object,就是我們在宣告結構時,如:Ham,Grocery中些,有UID的結構,在我們生成他時,他就是一個object。
而我們的所要放入的參數,就是Grocery。接下來{}的部分,則是另外我們要放入Grocery的參數,因為當我們要將Grocery分享出去時,代表他是必須被生成後,才能分享,所以這邊等於是直接把它全部寫在一行代碼裡。
Grocery 需要的參數,就是我們前面所些的有 id:UID , profits: Balance,這兩個。
id:UID ,也就是賦予這個物件一個身份辨別Hash碼,sui中要賦予就只需要,id:object::new(ctx),
我們調用預設 object的模組,其中new的函數。
我們一樣看一下new預設的樣子
public fun new(ctx: &mut TxContext): UID {
這裡面可以看到我們需要給他一個ctx,而他會返回一個UID,這也對應到我們要賦予id的值,而這個UID是系統隨機生成的。而ctx就代表是我們部署者的錢包,他必須確認有一個地址去執行這個動作。(這部分我的理解是這樣啦)
接著profits,我們所要給賦予他的是 balance::zero(),
這個意思是指,定義profits 是餘額為0個SUI的意思。<>中的SUI是對應我們一開始在宣告他時,我們定義它是一個專門儲存SUI的餘額值。所以這邊我們一樣要輸入。而zero就很直接代表他是0。
這邊之所以要這麼做,是因為sui中,當我們要生成每個物件時,如果他的定義中有幾項內容,我們就一定要放入幾個參數進去,不然系統會報錯。
再來
transfer::transfer(
GroceryOwnerCapability{id:object::new(ctx)},tx_context::sender(ctx));
應該就比較好理解了,使用transfer模組中,transfer的函數,就是要傳遞的功能。
transfer的函數要有兩個參數要填入,第一是要傳遞的object,第二是要傳到哪個地址。
這邊我們可以看到我們要傳的是雜貨店老闆的能力,那跟前面一樣,生成他要給他一個UID,接著後面這段tx_context::sender(ctx),則是指,我們要傳送到我們現在部署者的錢包的意思。
而這串代碼,也就直接定義了我們的錢包是這間雜貨店老闆的意思,之後要領錢時,只有我們這個錢包可以領。
因為這是init,初始函數,所以當我們部署合約時,這個函數將直接被啟用,我們誰部署他,就直接獲得身份。